# coding:utf-8

from functools import reduce

fruits = ['apple', 'banana', 'orange']

"""
filter(function, iterable)
用 iterable 中函数 function 返回真的那些元素，构建一个新的迭代器。iterable 可以是一个序列，一个支持迭代的容器，或一个迭代器。
如果 function 是 None ，则会假设它是一个身份函数，即 iterable 中所有返回假的元素会被移除。
"""
result = filter(lambda x: 'e' in x, fruits)
print(list(result))  # ['apple', 'orange']
print(fruits)  # ['apple', 'banana', 'orange']


# 使用函数
def filter_func(item):
    if 'e' in item:
        return True


print('--------------')
filter_result = filter(filter_func, fruits)
print(list(filter_result))  # ['apple', 'orange']

"""
map(function, iterable, ...)
返回一个将 function 应用于 iterable 中每一项并输出其结果的迭代器。 如果传入了额外的 iterable 参数，function 必须接受相同个数的实参
并被应用于从所有可迭代对象中并行获取的项。 当有多个可迭代对象时，最短的可迭代对象耗尽则整个迭代就将结束。
"""
map_result = map(filter_func, fruits)
print(list(map_result))  # [True, None, True]

"""
functools.reduce(function, iterable[, initializer])
将两个参数的 function 从左至右积累地应用到 iterable 的条目，以便将该可迭代对象缩减为单一的值。 
例如，reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])是计算 ((((1+2)+3)+4)+5) 的值。 左边的参数 x 是积累值而右边的参数 y 则是
来自 iterable 的更新值。
"""
reduce_result = reduce(lambda x, y: x * y, [1, 1, 2, 4, 4])
print(reduce_result)  # 32

reduce_result_str = reduce(lambda x, y: x + y, fruits)
print(reduce_result_str)  # applebananaorange
